package gw.com.android.utils;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import com.gwtsz.gts2.hx.R;

import java.lang.reflect.Field;

/**
 * 生成一个始终跟随 参数控件的窗口
 */
public class CopyDialog extends Dialog {

    public static final int LOCATION_CENTER = 0x01;//风格1，居中
    public static final int LOCATION_UPON = 0x02;// 风格2，居上

    /**
     * 创建一个 始终处于文字区域内部中心处的复制menu
     *
     * @param context
     * @param layout
     * @param tv_relative
     */
    public CopyDialog(@NonNull Context context, View layout, View tv_relative, int type, int h, int w) {
        super(context, R.style.copyDialog);
        setContentView(layout);
        Window window = getWindow();
        WindowManager.LayoutParams params = window.getAttributes();

        if (type == LOCATION_CENTER) {
            params.gravity = Gravity.TOP | Gravity.LEFT;// dialog的初始位置为左上角

            Rect r = new Rect();
            tv_relative.getGlobalVisibleRect(r);

            params.x = r.left + (r.right - r.left) / 2;//X轴上平移，直到X轴的值，在tv_relative的中心线
            params.y = r.top + (r.bottom - r.top) / 2 - getStatusBarHeight(context);//特殊情况特殊处理，减去状态栏的高度，要是哪天app不要状态栏了，再说吧。
        } else if (type == LOCATION_UPON) {
            params.gravity = Gravity.TOP | Gravity.LEFT;// 初始位置是置顶，横向居中

            Rect r = new Rect();
            tv_relative.getGlobalVisibleRect(r);
            params.x = r.left + (r.right - r.left) / 2 - w / 2;
            params.y = r.top - getStatusBarHeight(context) - h - 10;
            // 还要减去layout本身的高度
        }

        window.setAttributes(params);
    }

    /**
     * 获取状态栏的高度，经过测试，我发现 dialog出现的位置，居然会受到状态栏的影响，匪夷所思
     * <p>
     * 所以，在这里增加了这个方法，获取状态栏高度；
     *
     * @param context
     * @return
     */
    private int getStatusBarHeight(Context context) {

        //判定当前状态栏是不是显示
        //如果没有显示，那就直接返回0
        //如果显示了，那就往下走
        //TODO  可惜了，没找到解决方案，这个东西优先级不高，先放着吧

        Class<?> c = null;
        Object obj = null;
        Field field = null;
        int x = 0;
        try {
            c = Class.forName("com.android.internal.R$dimen");
            obj = c.newInstance();
            field = c.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            return context.getResources().getDimensionPixelSize(x);
        } catch (Exception e1) {
            Log.d("asdfsadf", "get status bar height fail");
            e1.printStackTrace();
            return 25;
        }
    }
}
